其他
活人不能让尿憋死,自动出来的图例不好调?自己徒手画一个!
答案嘛,就是自己画legend啊,你看看legend函数,还不是些简单的代码在画,自己画即可。不要被这些条条框框给套住。
从ggplot2拿legend
为了突破你的想像力,在此处甚至于我要给你个例子,用ggplot2
来生成个legend,放在base plot上去。
自己画legend,有何不可?!如果base有现成的函数画图,而你只熟悉ggplot2,你甚至于可以互搞。而互搞,当然要借助于ggplotify
包:《ggplotify简史》。
col = colorspace::rainbow_hcl(3)
names(col) = unique(iris$Species)
library(ggplotify)
color = col[iris$Species]
p = as.ggplot(~plot(iris$Sepal.Length, iris$Sepal.Width, col=color, pch=15))
library(ggplot2)
p2 = ggplot(iris, aes(Sepal.Length, Sepal.Width, color=Species)) +
geom_point() + scale_color_manual(values=col, name="")
legend = cowplot::get_legend(p2)
p + ggimage::geom_subview(x=.7, y=.6, subview=legend)
这里用base plot画了一个图,又用ggplot2
画了一个,用cowplot
把legend抽出来,然后再用我的另一个包ggimage
进行图上嵌图,完事。ggimage
实例可以参考这篇《shit,拟合的残差这么大!》。
用ggplot2画legend
上面这例子是不是还不过瘾,因为啊我还是用ggplot2
给重新画了一遍,如果你这么看,那么你的脑洞不够大,画是画了,但不一定要画一样的图,比如说有现成的base函数画复杂的图,而你不会用ggplot2
画,但不妨碍你画个简单的图,但这简单的图中的图例可以切出来使用啊。
呼应我上面讲到的,图例自己徒手画,我们用ggplot2
来来徒手一下。画出下面这个图例:
p2 <- ggplot() +
annotate("point", x=1,y=1:3,shape=15, color=col) +
annotate("text", x=1.01, y=1:3, label=names(col), hjust=0) +
xlim(0.99, 1.2) + ylim(0, 4) + theme_void()
对着代码看,不应该有什么问题,打了三个点,再打了三个相应的文本。然后再让我们把这图当做图例,嵌套到base plot上去。
p + ggimage::geom_subview(x=.25, y=.8, subview=p2)
直接画出legend
当然如果是徒手画,那么也就没必要单独画legend了,直接画到图上,因为我们有ggplotify
包,啥都能转成ggplot
,像这个base plot已经是ggplot
对象了,直接把画legend的代码搬上去就行。
y = c(.77,.8,.83)
p + annotate("point", x=.2,y=y,shape=15, color=col, size=3) +
annotate("text", x=.21, y=y, label=names(col), hjust=0)
ggplot2
你也可以自己画图例,然后和图拼在一起,或者嵌套到图上,这里有有实例《多个热图,多种配色,还要分开画图例?》。
往期精彩